Network Programmability and Automation 101

Enginyeria La Salle, May 18

Christian Adell @chadell0

Agenda

Time Topic
Day 1
15:30 - 16:00 Network Programmability & Automation
16:00 - 16:30 Ansible 101
16:30 - 17:00 Exercise 1
Day 2
15:30 - 16:00 Ansible 102
16:00 - 17:00 Exercise 2

Day 1

Network Programmability and Automation 101

What is Software Defined Networking?

Openflow

Network Functions Virtualization

Virtual switching

Network virtualization

Device APIs

Network Automation

Bare-metal switching

Data center network fabrics

SD-WAN

Controller networking

Network Automation

Why

  • Simplified Architectures
  • Deterministic Outcomes
  • Business Agility

Types

  • Device Provisioning
  • Data Collection
  • Migrations
  • Configuration Management
  • Compliance
  • Reporting
  • Troubleshooting

Application Programming Interfaces (APIs)

  • SNMP
  • SSH/Telnet and the CLI
  • NETCONF
  • RESTful APIs

Data Formats, Data Models and Config Templates

XML

<rpc-reply xmlns:junos="http://xml.juniper.net/junos/13.3R5/junos">
    <software-information>
        <host-name>M320-TEST-re0</host-name>
        <product-model>m320</product-model>
        <product-name>m320</product-name>
        <junos-version>13.3R5.9</junos-version>
    </software-information>
    <cli>
        <banner>{master}</banner>
    </cli>
</rpc-reply>

YAML

---
parameter_defaults: 
  ControlPlaneDefaultRoute: "192.0.2.1"
  ControlPlaneSubnetCidr: 24
  DnsServers:
    - "192.168.23.1"
  EC2MetadataIp: "192.0.2.1" 
  ExternalAllocationPools:
    - end: "10.0.0.250"
      start: "10.0.0.4"
  ExternalNetCidr: "10.0.0.1/24"
  NeutronExternalNetworkBridge: ""

JSON

{
  "parameter_defaults": {
    "ControlPlaneDefaultRoute": "192.0.2.1", 
    "ControlPlaneSubnetCidr": "24", 
    "DnsServers": [
        "192.168.23.1"
    ], 
    "EC2MetadataIp": "192.0.2.1", 
    "ExternalAllocationPools": [
        {
            "end": "10.0.0.250", 
            "start": "10.0.0.4"
        }
    ], 
    "ExternalNetCidr": "10.0.0.1/24", 
    "NeutronExternalNetworkBridge": ""
  }
}

YANG

 module configuration {
  namespace "http://xml.juniper.net/xnm/1.1/xnm";
  prefix junos;
  organization
    "Juniper Networks, Inc.";
  revision "2015-09-11" {
    description "Initial revision";
  }
  typedef ipv4addr {
    type string;
  }
  grouping juniper-config {
    container backup-router {
      description "IPv4 router to use while booting";
      leaf address {
        description "Address of router to use while booting";
        type ipv4addr;
        mandatory true;
      }
      presence "enable backup-router";
      leaf-list destination {
        description "Destination network reachable through the router";
        type ipv4prefix;
      }
    }
    ...

https://raw.githubusercontent.com/Juniper/yang/master/14.2/configuration.yang

JINJA

{% for key, value in vlanDict.iteritems() -%}
vlan {{ key }}
    name {{ value }}
{% endfor %}
>>> vlanDict = {123: 'TEST-VLAN-123', 234: 'TEST-VLAN-234', 345: 'TEST-VLAN-345'}
>>> from jinja2 import Environment
>>> env = Environment(loader=FileSystemLoader('./Templates/'))
>>> template = env.get_template('ourtemplate')
>>> print template.render(vlanDict)

vlan 123
    name TEST-VLAN-123
vlan 234
    name TEST-VLAN-234
vlan 345
    name TEST-VLAN-345

Ansible 101

Review of automation tools

  • Ansible
  • Chef
  • Puppet
  • Salt
  • StackStorm

Understanding how Ansible works

  • Automating servers
    • Distributed execution
    • Copy via SSH python code and runs in every device
  • Automating network devices
    • Centralised execution
    • Runs python code locally and reach network devices by SNMP, SSH or APIs

Basic files and defaults

* Playbook
* Inventory

Inventory file

Contains the devices (ip or fqdn) that will be automated, and the associated variables

[barcelona-dc]
switch01
switch02

[madrid-dc]
172.31.200.1
switch03

[barcelona-cpe]
vmx1

[madrid-cpe]
172.22.3.1

[barcelona:children]
barcelona-dc
barcelona-cpe

Assigning variables

[all:vars]
ntp_server=10.20.30.4

[barcelona:vars]
ntp_server=192.168.0.1

[madrid:vars]
ntp_server=10.0.0.1

or

[barcelona-dc]
switch01 ntp_server=192.168.0.3
switch02

Executing an Ansible Playbook

It's the file that contain your automation instructions

---
    - name: PLAY 1 - Configure Interface Speed
      hosts: barcelona-dc
      connection: local
      gather_facts: no

      tasks:

        - name: TASK1 - Get interface information
          ios_command:
            commands:
                - show run | include interfaces
            provider:
                username: myusername
                password: mypassword
                host: "{{ inventory_hostname }}"

Exercise 1

Goal

Experiment with basic Ansible automation

All you need is here: https://github.com/chadell/ansible-cumulus-vyos

Scenario

TODO

  • list of things
  • list of things

Agenda

Time Topic
Day 1
15:30 - 16:00 Network Programmability & Automation
16:00 - 16:30 Ansible 101
16:30 - 17:00 Exercise 1
Day 2
15:30 - 16:00 Ansible 102
16:00 - 17:00 Exercise 2

Day 2

Using Variable Files

TBD

Writing Ansible Playbooks

TBD

Using 3rd-party Ansible modules

TBD

Exercise 2

Goal

Extend Ansible feautures to provision a network

All you need is here: https://github.com/chadell/ansible-cumulus-vyos

Scenario

TODO

  • list of things
  • list of things